// 都可以改变this的指向（手写要用普通函数，不然内部拿不到调用者this值），
// 其实就是把调用者（函数）暂时性的添加到对象（第一个参数）上，主要用途是实现了对象可以调用非自身函数，更加灵活方便

// Function.prototype.myCall = function(obj,...args){
//     const key = Symbol('key')
//     obj[key] = this
//     const res = obj[key](...args)
//     delete obj[key]
//     return res
// }

// const a = 1
// console.log(Object.prototype.toString.call(a))

// Function.prototype.myApply = function(obj,arr){
//     const key = Symbol('key')
//     obj[key] = this
//     const res = obj[key](...arr)
//     delete obj[key]
//     return res
// }
Function.prototype.myBind = function(obj,...args){
  const that = this
  console.log('this:',this)
    return function(...reargs){
        // 法一，直接调用call
        // this.call(obj,...args,...reargs)
        // 法二，自己实现call
        const key = Symbol('key')
        obj[key] = that
        const res = obj[key](...args,...reargs)
        delete obj[key]
        return res
    }
}
  const person = {
    name: 'zhangsan'
  }
  function fn(a,b,c) {
    return a+b+c
  }
  const resFn = fn.myBind(person,1,2)
  console.log(resFn)
  console.log(resFn(3))	//6
  

